<?php
/**
 * Created by PhpStorm.
 * User: guokunsheng
 * Date: 2020/9/17
 * Time: 14:43
 */

namespace app\astrologer\controller;

use app\common\cachemodel\ZlcrAstr;
use app\common\cachemodel\ZlcrAstrAccount;
use app\common\cachemodel\ZlcrAstrInfo;
use app\common\cachemodel\ZlcrAstrMessage;
use app\common\cachemodel\ZlcrAstrMiniInfo;
use app\common\cachemodel\ZlcrContentCheck;
use app\common\controller\Avatar;
use app\common\lib\Aes;
use app\common\lib\Alidayu;
use app\common\lib\exception\ApiException;
use app\common\lib\IAuth;
use app\common\lib\Util;
use app\common\lib\Wechat;
use app\zyhsapi\model\ZyhsAstrBindUser;
use app\zyhsapi\model\ZyhsUser;
use Exception;
use think\Cache;
use think\Db;
use think\Env;
use think\Log;
use think\response\Json;
use XznsTools\cache\CacheManage;

/**
 * 占星师后台用户相关
 * Class User
 * @support v1.0.0
 * @package app\astrologer\controller
 */
class User extends AstrAuth
{
    protected $token = 'astrlog';//填写你设定的key
    protected $appID = 'wx275e0cf29b3f072e';//填写高级调用功能的app id, 请在微信开发模式后台查询
    protected $appsecret = '2f602b14cf51d20fc50a219ad7a457de';//填写高级调用功能的密钥
    protected $encodingaeskey = 'eWQa2BsQCiNWiysLqTBtlGH8nACNgJZNRZLnhoLMEOH';//填写加密用的EncodingAESKey

    public static $statusInfoOld = [ //  认证状态 10=>占星师考核  11=>待审核  12=>考核未通过 20=>资料填写 21=>资料待审核 22=>资料审核未通过 30=>培训  40=>认证完成（可接单）
        10 => 1,
        11 => 1,
        12 => 1,
        20 => 2,
        21 => 2,
        22 => 2,
        30 => 3,
        40 => 100,  // 100为已通过全部占星师接单要求
    ];
    public static $statusInfo = [ //  认证状态 10=>占星师考核  11=>待审核  12=>考核未通过 20=>资料填写 21=>资料待审核 22=>资料审核未通过 30=>培训  40=>认证完成（可接单）
        10 => 1,
        11 => 1,
        12 => 1,
        20 => 1,
        21 => 1,
        22 => 1,
        30 => 3,
        40 => 100,  // 100为已通过全部占星师接单要求
    ];

    /**
     * 退出登录
     */
    public function logout()
    {
        try
        {
            if (!$this->is_simulated)
            {
                // 退出登陆
                (new ZlcrAstr())->save(['token' => ''], ['id' => (int)$this->astrInfo['id']]);
            }
        }
        catch (Exception $e)
        {
            Log::write($this->astrInfo['id'] . '占星师后台退出登录失败：' . $e->getMessage() . '失败行数：' . $e->getLine(), 'error');

            return show(config('code.error'), '服务异常；请稍后再试～');
        }

        return show(config('code.success'), '退出登陆成功！');
    }

    /**
     * 获取当前用户信息
     */
    public function info()
    {
        $host = Env::get('host.photo');

        $roles = ['astrologer_not_completed'];//未完成章程学习的角色
        if ((int)$this->astrInfo['check_status'] === 40)
        {
            $roles = ['astrologer'];//完成章程学习的角色/特邀用户
        }
        $accountInfo = (new ZlcrAstrAccount())->getAstrAccountInfo($this->astrInfo['id'], ['balance']);
        $authStatus = $this->astrInfo['auth_status'];
        $passList = [
            0 => $authStatus['custom_report'],
            1 => $authStatus['question_answer_astr'],
            2 => $authStatus['question_answer_dice'],
            3 => $authStatus['question_answer_tarot'],
        ];

        $pauseTime = $this->astrInfo['pause_time'] - time();

        $data = [
            'avatar' => $this->astrInfo['avatar'] ? $host . $this->astrInfo['avatar'] : '',
            'introduction' => 'I am a super administrator',
            'name' => $this->astrInfo['nickname'],
            'astr_level' => (int)$this->astrInfo['astr_level'],
            'astro_grade' => (int)$this->astrInfo['astro_grade'],
            'status' => (int)$this->astrInfo['status'], // 1=>正常 0=>禁止（禁止登陆） 2=>账号冻结（可以登录，但是不能接单）长期冻结
            'step' => self::$statusInfoOld[$this->astrInfo['check_status']],// 0=>未开始,1=>注册成功,2=>占星考试完成,3=>完善资料完成,4=>平台培训完成,5=>,100为已通过全部占星师接单要求
            'roles' => $roles,//'astrologer_not_completed':未完成章程学习的角色;'astrologer':完成章程学习的角色/特邀用户
            'percent_proportion' => $this->astrInfo['proportion'] * 100,  // 收益比例百分比
            'percent_rate' => (int)$this->astrInfo['rating'],  // 好评率百分比
            'create_date' => date('Y-m-d', $this->astrInfo['create_time']), //账号创建日期
            'tel' => substr_replace($this->astrInfo['tel'], '****', 3, 4),//手机号
            'hint' => Util::getAstrologerLevelUpDes((int)$this->astrInfo['astr_level'], (int)$this->astrInfo['astro_grade']),//升级提示
            'earns' => $accountInfo['balance'],
            'pause_status' => $pauseTime > 0 ? 1 : 0, // 账户临时冻结状态 到时间自动解冻 1=>账号冻结 0=>未冻结
            'pause_time' => $pauseTime > 0 ? $pauseTime : 0, // 距离解冻剩余时间的 时间戳
            'is_have_new_msg' => (new ZlcrAstrMessage())->getNewMessageNum($this->astrInfo['id']) > 0 ? 1 : 0,//是否显示消息new图标：1=》显示；0=》不显示
            'pass_list' => $passList,
        ];
        return show(200, '请求成功', $data);
    }

    /**
     * 小程序绑定手机号
     */
    public function bindTel()
    {
        $env_type = $this->request->header('app-type', 'PC'); // app-type = ALIPAY(支付宝小程序) ｜ WEAPP(微信小程序) ｜ WEB（H5） ｜ PC（PC后台）；default = PC
        $tel = trim(input('tel/s', ''));
        $code = trim(input('code/s', ''));

        if (!in_array($env_type, ['ALIPAY', 'WEAPP'], true))
        {
            return show(config('code.error'), '服务异常～');
        }

        // 手机号是否存在
        if (!preg_match("/^1[3456789]{1}\d{9}$/", $tel))
        {
            Log::write('手机号错误：' . $tel, 'error', true);
            throw new ApiException('手机号错误', 200, 0);
        }

        // 短信验证码 或 密码是否存在
        if (empty($code))
        {
            return show(config('code.error'), '请输入验证码');
        }

        if ($this->astrInfo['tel'])
        {
            return show(config('code.error'), '已经绑定手机号，禁止重复绑定');
        }

        //防止暴力破解：手机号验证码登录失败10次后 除非重新获取验证码 否则验证码登录 验证码有效期（10分钟）内都自动错误
        $key_of_tel_code_bind_error_num = 'bind_tel_error_zhunle_astrologer:' . $tel;
        if (Cache::get($key_of_tel_code_bind_error_num, 0) >= 10)
        {
            Log::write($tel . '占星师后台手机号验证码登录失败超过10次，验证码失效', 'error');
            return show(config('code.error'), '短信验证码错误！');
        }

        $appConfig = config('app');
        // 短信登录时，检测验证码是否正确
        if (!in_array($tel, $appConfig['mobile'], false) || (strpos($appConfig['code'] * (substr($tel, 3, 6)), $code) !== 0))
        {
            //  validate 严格校验
            $mobileCode = Alidayu::getInstance()->checkSmsIdentify($tel, 86); // 获取验证码
            if ($code != $mobileCode)
            {// 如果验证码错误
                if (Cache::has($key_of_tel_code_bind_error_num))
                {
                    Cache::inc($key_of_tel_code_bind_error_num);
                } else
                {
                    Cache::set($key_of_tel_code_bind_error_num, 1, 600);
                }
                return show(config('code.error'), '短信验证码错误！');
            }
        }

        try
        {
            $astrModel = (new ZlcrAstr());
            $astrInfo = $astrModel->where(['tel' => $tel])->field('id,tel,password,salt,check_status,status,create_time,password_reset_at,token,token_expire')->find();
            if ($astrInfo)
            {   // 已经注册过
                $MiniAppUser = new ZlcrAstrMiniInfo();
                // 更新access_token 或续期
                $simulation_astrologer = config('simulation_astrologer');
                if ((isset($simulation_astrologer['is_support_muti']) && 1 === (int)$simulation_astrologer['is_support_muti']) && $astrInfo['token_expire'] > $this->request->time())
                {   // 开通多端登录并且access_token未过期 给token续期
                    $astrTokenData['token_expire'] = strtotime('+' . config('simulation_astrologer.login_time_out_seconds') . ' seconds');
                } else
                {   // 重新生成token
                    $astrTokenData = [
                        'token' => IAuth::setAppLoginToken($tel),
                        'token_expire' => strtotime('+' . config('simulation_astrologer.login_time_out_seconds') . ' seconds'),
                    ];
                    $astrInfo['token'] = $astrTokenData['token'];
                }
                $astrModel->UpdateData($astrInfo['id'], ['id' => $astrInfo['id']], $astrTokenData);
                // 更新小程序账户绑定的占星师ID
                $miniAppData = $MiniAppUser->where('astr_id', $this->astrInfo['id'])->field('id,astr_id')->find();
                $miniAppData->astr_id = $astrInfo['id'];
                $miniAppData->save();
            } else
            {   // 没有注册过
                $astrModel->UpdateData($this->astrInfo['id'], ['id' => $this->astrInfo['id']], ['tel' => $tel]);
                $astrInfo = $this->astrInfo;
            }

            $roles = ['astrologer_not_completed'];//未完成章程学习的角色
            $path = '/dashboard/index';//跳转的路径，默认跳转首页
            if ($astrInfo['check_status'] == 40)
            {
                $roles = ['astrologer'];//完成章程学习的角色/特邀用户
            } else
            {
                $path = '/account/index';//跳转到考试页面
            }

            $data = [
                'token' => (new Aes())->encryptWithOpenssl($astrInfo['token'] . '||' . $astrInfo['id']),
                'roles' => $roles,
                'path' => $path,
                'has_bind_tel' => 1,
                'step' => self::$statusInfo[$astrInfo['check_status']],
            ];
            //状态 1=>正常 0=>禁止（禁止登陆） 2=>账号冻结（可以登录，但是不能接单
            if ($astrInfo['status'] === 2)
            {
                Log::write("占星师后台小程序【绑定手机号】登录成功；占星师ID【{$astrInfo['id']}】：您的账号已被冻结，请联系客服反馈问题～", 'error');
                return show(406, '绑定成功成功，您的账号已被冻结，请联系客服反馈问题～', $data);//403: 在其他客户端登录; 405 未登录，前往登录；406：前端提示错误信息，但是返回的数据正常
            } else
            {
                return show(config('code.success'), '绑定成功成功', $data);
            }
        }
        catch (\Exception $e)
        {
            Log::write("占星师后台小程序【绑定手机号】失败；占星师ID【{$this->astrInfo['id']}】绑定手机号：{$tel};错误消息：{$e->getMessage()},LINE:{$e->getLine()};FILE:{$e->getFile()};", 'error');
            return show(config('code.error'), '服务异常；绑定失败');
        }
    }

    /**
     * 搜索支行
     * @return Json
     */
    public function searchBankBranch()
    {
        $params = $this->request->only(['bank_no', 'bank_name', 'keyword', 'page', 'province', 'city']);

        if (!$params['bank_no'])
        {
            return show(0, '请输入银行卡号！');
        }

        //支行名称替换
        if ($params['bank_name'] === '浦发银行')
        {
            $params['bank_name'] = '上海浦东发展银行';
        }

        return Util::checkBankBranchInfo($params['bank_no'], $params['bank_name'], isset($params['keyword']) ? $params['keyword'] : '', $params['page'], isset($params['province']) ? $params['province'] : '', isset($params['city']) ? $params['city'] : '');
    }

    /**
     * 用户完善资料
     * @return Json
     * @throws Exception
     */
    public function compoleteInfo()
    {
        $data['userinfo'] = $param = $this->request->param();

        //todo 校验信息
//back: "/upload/check/right/20210311/9a2fe81e71ea00fde00a83a6cc6086be.jpg"
//bank_branch_code: "308100005078"
//bank_name: "招商银行"
//bank_num: "6214850115717628"
//bank_user_id_number: "130984199009063611"
//bank_username: "李柏楠"
//bank_verfiy: "842750"
//face: "/upload/check/left/20210311/ee0d85fda4aff46408e8c311df330ae0.jpg"
//holding: "/upload/check/pic/20210311/a8f39e44c2b8717f3bb8845e10c71419.jpg"
//id_number: "130984199009063611"
//nickname: "李老师"
//tel: "18502127689"
//truename: "李柏楠"

        //astro认证状态 10=>占星师考核  11=>待审核  12=>考核未通过 20=>资料填写 21=>资料待审核 22=>资料审核未通过 30=>培训   40=>认证完成（可接单）
        $zlAstrModel = new ZlcrAstr();
        $zlAstrInfoModel = new ZlcrAstrInfo();
        $astrInfo = $zlAstrInfoModel->getInfoById($this->astrInfo['id']);
        if ($this->request->isPost())
        {
            //新增占星师身份信息
            $paramRes = $this->checkCompoleteInfoParam($param, $zlAstrModel);
            if ($paramRes['status'] === false)
            {
                return show(0, $paramRes['msg'], $paramRes['data']);
            }
            //支行名称替换
            if ($param['bank_name'] === '上海浦东发展银行')
            {
                $param['bank_name'] = '浦发银行';
            }
            //获取占星师身份信息是否存在，存在则更新
            $astrInfoData = [
                'astr_id' => $this->astrInfo['id'],
                'name' => $param['truename'],
                'telphone' => $this->astrInfo['tel'],
                'id_card' => $param['id_number'],
                'left_pic' => $param['face'],
                'left_pic_info' => '',
                'right_pic' => $param['back'],
                'right_pic_info' => '',
                'hand_idcard_pic' => $param['holding'],
                'hand_idcard_pic_info' => '',
                'bank_card' => $param['bank_num'],
                'bank_name' => $param['bank_name'],
                'bank_id_card' => $param['bank_user_id_number'],
                'bank_id_card_name' => $param['bank_username'],
                'bank_info' => '',
                'bank_branch_info' => '',
                'create_time' => time(),
            ];

            $astrData = [
                'avatar' => '',
                'nickname' => '',
            ];

            //识别身份证信息
            //验证身份证正面照片
            $res = $this->checkPicOfIdCard($this->astrInfo['id'], 3, $astrInfoData['left_pic']);
            if ($res['status'] === true)
            {//验证成功
                $month = date('m', $res['data']['birthday']);//19900906
                $day = date('d', $res['data']['birthday']);//19900906
                $sign_index = Util::getSignIndex($month, $day);
                $avatar = '/zhunle_astrologer/avatar/' . $sign_index . '.png';
                $astrData['avatar'] = $avatar;//头像
                $astrData['nickname'] = mb_substr($res['data']['name'], 0, 1) . '老师';//昵称
                $astrInfoData['name'] = $res['data']['name'];//真实姓名
                $astrInfoData['id_card'] = $res['data']['idcard'];//身份证号
                $astrInfoData['left_pic_info'] = json_encode($res['data']);//身份证正面图片信息
            } else
            {
                return show(0, '新增失败，身份证正面照片验证失败！');
            }

            //验证身份证反面照片
            $res = $this->checkPicOfIdCard($this->astrInfo['id'], 4, $astrInfoData['right_pic']);
            if (!$res['status'])
            {
                return show(0, '新增失败，身份证反面照片验证失败！');
            } else
            {
                $astrInfoData['right_pic_info'] = json_encode($res['data']);//身份证反面图片信息
            }

            //验证手持身份证照片
            $res = $this->checkPicOfIdCard($this->astrInfo['id'], 5, $astrInfoData['hand_idcard_pic']);
            if (!$res['status'])
            {
                return show(0, '新增失败，手持身份证照片验证失败！');
            } else
            {
                if ($res['data']['score'] < 0.3)
                {
                    Log::write('新增手持身份证照片认证结果，小于0.3（需要降低点）', 'error', true);
                    return show(0, '新增失败，手持身份证照片认证失败！');
                } else
                {
                    $astrInfoData['hand_idcard_pic_info'] = json_encode($res['data']);//手持身份证正面图片信息
                }
            }

            //验证银行卡信息
            $bankCheckRes = Util::checkBankIdentityThreeElements($astrInfoData['bank_card'], $astrInfoData['bank_id_card'], $astrInfoData['bank_id_card_name']);
            if ($bankCheckRes['status'] === false)
            {
                $data['compeleteState'] = 3;
                $data['compeleteText'] = "<span class='tip'>{$bankCheckRes['msg']}</span>，请修改后重新提交审核。";
                return show(0, $bankCheckRes['msg'] . '，请修改后重新提交审核。');
            } else
            {
                $astrInfoData['bank_info'] = json_encode($bankCheckRes['data']);

                //验证开户行是否正确
                if (strpos($bankCheckRes['data']['bankName'], $astrInfoData['bank_name']) === false && strpos($astrInfoData['bank_name'], $bankCheckRes['data']['bankName']) === false)
                {//不包含 解析出来有可能是 中国工商银行
                    //---------------------------------------------------------------
                    //[ 2024-07-31T14:18:17+08:00 ] 175.167.148.196 POST wechat.goddessxzns.com/astrologer/v2/user/compoleteInfo
                    //[ error ] 请求头：{"model":"taro  RMX3700","channel":"astrologer","version":"1.2.2","access-token":"b995d98a4beba4855222bb94089eeb1b86561185||116444","user-agent":"Dart\/3.2 (dart:io)"}用户新增银行卡资料，支持的银行卡错误（需要更新占星师前端的银行卡列表 或者 去掉银行名字的验证）：用户选择的银行=中国农业银行，查询云市场的支行名字为：农业银行
                    //---------------------------------------------------------------
                    Log::write('用户新增银行卡资料，支持的银行卡错误（需要更新占星师前端的银行卡列表 或者 去掉银行名字的验证）：用户选择的银行=' . $astrInfoData['bank_name'] . '，查询云市场的支行名字为：' . $bankCheckRes['data']['bankName'], 'error', true);
                    return show(0, $bankCheckRes['msg'] . '，开户行错误，请修改后重新提交审核。');
                }

                //根据联行号查询支行信息
                $bank_branch_info = Util::checkBankCode($param['bank_branch_code']);
                if ($bank_branch_info['status'])
                {//成功，检查开户行是否一样
//                    if (strpos($bank_branch_info['data']['bank'], $bank_name) === false)
//                    {//不包含 解析出来有可能是 中国工商银行
//                        Log::write('用户编辑银行卡资料，支持的银行卡错误（需要更新占星师前端的银行卡列表 或者 去掉银行名字的验证）：用户选择的银行=' . $bank_name . '，查询云市场的支行名字为：' . $bank_branch_info['data']['bank'], 'error', true);
//                        return show(0, $bankCheckRes['msg'] . '，开户行错误，请修改后重新提交审核。');
//                    }
                    $astrInfoData['bank_name'] = $bank_branch_info['data']['bank'];
                    $astrInfoData['bank_branch_name'] = $bank_branch_info['data']['lName'];
                    $astrInfoData['bank_branch_info'] = json_encode($bank_branch_info['data']);
                } else
                {//失败
                    Log::write('支行信息查询失败，请修改后重新提交审核。', 'error', true);
                    return show(0, $bankCheckRes['msg'] . '支行信息查询失败，请修改后重新提交审核。');
                }


                //查询支行信息，这里不做强验证支行信息查询失败，需要客服联系用户获取（防止用户不知道支行信息，走不下去流程）
//                $bank_branch_info = Util::checkBankBranchInfo($astrInfoData['bank_card']);
//                if ($bank_branch_info['status'])
//                {//成功，检查开户行是否一样
//                    if (strpos($bank_branch_info['data']['bank'], $astrInfoData['bank_name']) === false)
//                    {//不包含 解析出来有可能是 中国工商银行
//                        Log::write('用户新增资料，支持的银行卡错误（需要更新占星师前端的银行卡列表 或者 去掉银行名字的验证）：用户选择的银行=' . $astrInfoData['bank_name'] . '，查询云市场的支行名字为：' . $bank_branch_info['data']['bank'], 'error', true);
//                        return show(0, '开户行错误，请修改后重新提交审核。');
//                    } else
//                    {//包含
//                        $astrInfoData['bank_name'] = $bank_branch_info['data']['bank'];
//                        $astrInfoData['bank_branch_name'] = $bank_branch_info['data']['addr'];
//                        $astrInfoData['bank_branch_info'] = json_encode($bank_branch_info['data']);
//                    }
//                } else
//                {//失败，todo 发送钉钉通知
//                    Log::write('新增-查询支行信息，这里不做强验证支行信息查询失败，需要客服联系用户获取（防止用户不知道支行信息，走不下去流程）', 'error', true);
//                }
            }

            //添加数据
            $res1 = $zlAstrInfoModel->SaveData($astrInfoData);
            if (!$res1)
            {
                $data['compeleteState'] = 4;
                $data['compeleteText'] = "<span class='tip'>服务异常，请稍后重试！</span>";
                Log::write('保存资料失败1,msg=', json_encode($res1), 'error', true);
                return show(0, '服务异常，请稍后重试！', $data);
            }
            $res2 = $zlAstrModel->UpdateData($this->astrInfo['id'], ['id' => $this->astrInfo['id']], [
                'check_status' => 30,
                'nickname' => $astrData['nickname'],
                'avatar' => $astrData['avatar'],
            ]);
            if (!$res2)
            {
                $data['compeleteState'] = 4;
                $data['compeleteText'] = "<span class='tip'>服务异常，请稍后重试！</span>";
                Log::write('保存资料失败2,msg=', 'error', true);
                return show(0, '服务异常，请稍后重试！', $data);
            }
            $data['compeleteState'] = 5;
            $data['compeleteText'] = "提交成功";
            $data['userinfo'] = null;
            return show(200, '提交成功', $data);
        } else
        {
            if ($astrInfo)
            {
                $data['userinfo'] = [
                    'avatar' => $this->astrInfo['avatar'],
                    'nickname' => $this->astrInfo['nickname'],
                    'truename' => $astrInfo['name'],
                    'id_number' => $astrInfo['id_card'],
                    'face' => $astrInfo['left_pic'],
                    'back' => $astrInfo['right_pic'],
                    'holding' => $astrInfo['hand_idcard_pic'],
                    'bank_num' => $astrInfo['bank_card'],
                    'bank_name' => $astrInfo['bank_name'],
                    'bank_address' => $astrInfo['bank_branch_name'],
                    'bank_username' => $astrInfo['name'],
                    'bank_user_id_number' => $astrInfo['id_card'],
                    'bank_verfiy' => '',
                    'tel' => $this->astrInfo['tel'],
                ];
                if ($this->astrInfo['check_status'] == 22)
                {
                    //获取审核信息
                    $check = (new ZlcrContentCheck())->getContentCheckInfo($this->astrInfo['id'], 4, ['status', 'ali_ckeck', 'desc']);
                    $msg = $check['desc'] ?: $check['ali_ckeck'];
//                    $msg = '123';
                    $data['compeleteState'] = 4;
                    //获取私有图片地址
                    $data['userinfo']['face_private_url'] = Upload::getOssPrivateUrl($data['userinfo']['face']);
                    $data['userinfo']['back_private_url'] = Upload::getOssPrivateUrl($data['userinfo']['back']);
                    $data['userinfo']['holding_private_url'] = Upload::getOssPrivateUrl($data['userinfo']['holding']);
                    $data['compeleteText'] = $msg;
                    return show(200, $msg, $data);
                } elseif ($this->astrInfo['check_status'] == 21)
                {
                    $data['compeleteState'] = 3;
                    $data['compeleteText'] = "请等待客服审核，留意短信通知，1-3个工作日内完成审核。";
                    $data['userinfo'] = null;
                    return show(200, '请求成功', $data);
                } elseif ($this->astrInfo['check_status'] == 30)
                {
                    $data['compeleteState'] = 5;
                    $data['compeleteText'] = '恭喜您成功完善了相关资料';
                    $data['userinfo'] = null;
                    return show(200, '请求成功', $data);
                } else
                {
                    $data['compeleteState'] = 1;
//                    $data['compeleteState'] = 2; //test
                    $data['compeleteText'] = '请完善相关资料';
                    return show(200, '请求成功', $data);
                }
            } else
            {//没有信息，刚开始上传，只把手机号给用户返回
                $data['userinfo'] = [
                    'tel' => $this->astrInfo['tel'],
                ];
                $data['compeleteState'] = 1;
//                $data['compeleteState'] = 2;//test
                return show(200, '请求成功', $data);
            }
            return show(0, $msg ?? '', $data);
        }
    }

    /**
     * 验证用户完善资料请求参数
     * @param $param
     * @param $zlAstrModel
     * @return array
     */
    private function checkCompoleteInfoParam($param, $zlAstrModel)
    {
        $data['userinfo'] = $param;
//        if (!isset($param['avatar']) || !$param['avatar'])
//        {
//            return [
//                'status' => false,
//                'msg' => '请上传头像',
//                'data' => []
//            ];
//        }

//        if (!isset($param['nickname']) || !$param['nickname'])
//        {
//            return [
//                'status' => false,
//                'msg' => '请填写昵称',
//                'data' => []
//            ];
//        }

        if (!isset($param['truename']) || !$param['truename'])
        {
            return [
                'status' => false,
                'msg' => '请输入真实姓名',
                'data' => [],
            ];
        }

        if (!isset($param['id_number']) || !$param['id_number'])
        {
            return [
                'status' => false,
                'msg' => '请输入身份证号',
                'data' => [],
            ];
        }

        if (!isset($param['face']) || !$param['face'])
        {
            return [
                'status' => false,
                'msg' => '请上传身份证正面照片',
                'data' => [],
            ];
        }

        if (!isset($param['back']) || !$param['back'])
        {
            return [
                'status' => false,
                'msg' => '请上传身份证反面照片',
                'data' => [],
            ];
        }

        if (!isset($param['holding']) || !$param['holding'])
        {
            return [
                'status' => false,
                'msg' => '请上传手持身份证照片',
                'data' => [],
            ];
        }

        if (!isset($param['bank_num']) || !$param['bank_num'])
        {
            return [
                'status' => false,
                'msg' => '请输入银行卡号',
                'data' => [],
            ];
        }

        if (!isset($param['bank_name']) || !$param['bank_name'])
        {
            return [
                'status' => false,
                'msg' => '请输入开户行',
                'data' => [],
            ];
        }

//        if (!isset($param['bank_address']) || !$param['bank_address'])
//        {
//            return [
//                'status' => false,
//                'msg' => '请输入支行信息',
//                'data' => []
//            ];
//        }

        if (!isset($param['bank_username']) || !$param['bank_username'])
        {
            return [
                'status' => false,
                'msg' => '请输入收款人姓名',
                'data' => [],
            ];
        }

        if (!isset($param['bank_user_id_number']) || !$param['bank_user_id_number'])
        {
            return [
                'status' => false,
                'msg' => '请输入收款人身份证号',
                'data' => [],
            ];
        }

        if (!isset($param['bank_verfiy']) || !$param['bank_verfiy'])
        {
            return [
                'status' => false,
                'msg' => '请输入验证码',
                'data' => [],
            ];
        }

        //验证手机验证码
        $code = Cache::get($this->astrInfo['tel']);
        if ($code != $param['bank_verfiy'])
        {
            $data['compeleteState'] = 4;
            $data['compeleteText'] = '您填写的 <span class="tip">验证码错误</span> 错误，请修改后重新提交审核。';
            return [
                'status' => false,
                'msg' => '验证码错误',
                'data' => $data,
            ];
        }

        //昵称不能重复
//        $aid = $zlAstrModel->where(['nickname' => $param['nickname']])->column('id');
//        if ($aid && (int)$aid[0] !== (int)$this->astrInfo['id'])
//        {
//            $data['compeleteState'] = 4;
//            $data['compeleteText'] = '您填写的 <span class="tip">昵称</span> 已被注册，请修改后重新提交审核。';
//            return [
//                'status' => false,
//                'msg' => '当前昵称已被注册，请重新输入！',
//                'data' => $data
//            ];
//        }

        //姓名身份证信息验证
//        $resData = Util::checkIdentityTwoElements($param['truename'], $param['id_number']);
//        if ($resData['status'] === false)
//        {
//            $data['compeleteState'] = 4;
//            $data['compeleteText'] = '您填写的 <span class="tip">身份证号</span> 信息不符合要求，请修改后重新提交审核。';
//            return [
//                'status' => false,
//                'msg' => '身份信息错误',
//                'data' => $data
//            ];
//        }

        //验证银行卡信息
//        $bankCheckRes = Util::checkBankIdentityThreeElements($param['bank_num'], $param['bank_user_id_number'], $param['bank_username']);
//        //todo 是否需要验证开户行
//        if ($bankCheckRes['status'] === false)
//        {
//            $data['compeleteState'] = 3;
//            $data['compeleteText'] = "<span class='tip'>{$bankCheckRes['msg']}</span>，请修改后重新提交审核。";
//            return [
//                'status' => false,
//                'msg' => $bankCheckRes['msg'] . '，请修改后重新提交审核。',
//                'data' => $data
//            ];
//        }
//        return [
//            'status' => true,
//            'msg' => '',
//            'data' => []
//        ];
    }

    /**
     * 上传图片
     * @return Json [type] [description]
     */
    public function avatar()
    {
        return (new Avatar())->upload('uploads/astro');
    }

    /**
     * 获取平台所有章程
     */
    public function getPlatformData()
    {
        $wap = [
            ['title' => '准了咨询平台服务章程'],
            ['title' => '第一章   总则'],
            [
                'des' => '1、本平台是准了APP旗下服务平台：准了咨询师平台（以下简称“平台”）
2、准了咨询师平台为咨询师提供咨询类服务，但严禁违规违法行为，一经发现取消平台服务资格冻结账号并扣除收益；
2.1 违反平台规则，包括且不限于：
（1）使用不文明用语、攻击性质话术言论谩骂攻击其他用户
（2）传播封建迷信思想，回复内容中带有宿命论、因果论等消极心理暗示
（3）鼓励或煽动用户的负面情绪对其造成更严重的消极心理暗示
（4）回复报告内容中提供或以各种形式提供联系方式或获取用户联系方式
（5）未经用户许可，私自透露用户隐私
（6）引导用户线下交易或其他平台进行交易
（7）回复内容中涉及政治、黄赌毒信息
（8）违反国家相关法律法规以及管制政策

2.2严禁进行反党反政府或带有侮辱诋毁党和国家的行为，包括且不限于：
（1）违反宪法确定的基本原则的；
（2）危害国家安全，泄露国家秘密，颠覆国家政权，破坏国家统一的；
（3）损害国家荣誉和利益的；
（4）煽动民族仇恨、民族歧视、破坏民族团结的言论；
（5）破坏国家宗教政策，宣扬邪教和封建迷信的言论；
（6）散布谣言，扰乱社会秩序，破坏社会稳定的言论；
（7）散布暴力、恐怖或者教唆犯罪的；
（8）煽动非法集会、结社、游行、示威、聚众扰乱社会秩序的；
（9）其他可能引起或已经引起不良影响的;',
            ],
            ['title' => '第二章   咨询师服务道德准则'],
            [
                'des' => '1、咨询师的职业纲领
（1）咨询师应谨慎的专注于当前咨询的用户与星盘，应避免利益驱动而产生“敷衍”、“凑合”等心态完成咨询
（2）咨询师应避免在与用户产生不对等关系条件下完成服务，自视甚高或过度崇拜、仰视关系等会导致咨询中双方无法公 正的完成服务
（3）咨询师应抱有社会责任感，严肃敬重的指引用户、输出正向阳光的价值导向，为社会健康发展尽一己之力
（4）咨询师应不断的持续学习和精进自身，丰富本身的经历与眼界不断的突破自身的局限，将更能更清楚的看清问题本质给予用户正确的价值导向
（5）咨询师应平等待人，避免因为用户的年龄、职业、宗教信仰、价值观等任何方面歧视而造成差别对待
（6）咨询师应尊重用户，避免因为用户的经历、价值观带来的选择而进行批判或非正向引导说教，尊重个案的选择并不轻视咨询方的想法是咨询师基本的职业道德
（7）咨询师应明确用户的咨询目的，分析用户的咨询真实需求，通过星盘能测算出的运势趋势范围、以及如何通过星盘可以帮助他提出相对的建议方案
（8）咨询师应避免铁口直断、宿命论等消极观念输出，通过个案当下状况探寻本身固有的模式导致问题发生的原因，并告知用户咨询师的建议不是至理名言也不是唯一选择，事件的改善以及走向都需要用户自身的判断选择、努力改善、以及积极面对才会解决
（9）咨询师在咨询时应保持客观中立，避免掺杂咨询师自本身的情感，告知用户通过星盘逻辑得到的走向或原因，并鼓励用户自己做出选择
（10）咨询师应该谨慎对待命运议题，不随意论断或介入决策，要有原则的开展咨询',
            ],
            ['title' => '第三章    咨询服务规则'],
            [
                'des' => '1.入驻及收益计算规则：
1.1需登录账号完成平台的入驻流程：技能考核（包括选择题测试、身份认证、基础面试）、章程考核，通过后可接单获取任务
1.2实际打款金额扣除相关手续费与劳务所得税，计算规则为： 订单流水先扣除订单渠道手续费1%、营业税费6.72%， 再按分成比例进行分成产生实际收益； 核算实际收益扣除个人劳务所得税后为实际打款金额

2.定制报告服务规则：
2.1.咨询服务-定制报告通过抢单获取任务，获取任务后需4小时内回复问题后提交至后台审核，审核成功后获得收益，如超时则取消任务并且冻结账号3天
2.2咨询服务-定制报告每次领取问题在回复页面会提供内容推荐模版，咨询师回复报告内容技法不限，但不能少于内容推荐模版，如回复报告内容少于推荐内容模版则不予通过
2.3 咨询服务-定制报告如问题回复超时由审核导致，咨询师在次月结算本月收益前可在后台申诉
2.4.咨询服务-定制报告如用户在15分钟内取消咨询师已接订单，则该订单取消，10%订单金额赔付咨询师
2.5咨询服务-定制报告接单后5分钟内咨询师可选择弃答，每日可弃答3次
2.6咨询服务-定制报告提交审核后，客服后在工作日24小时内审核完成，审核完成后才能继续领取问答任务
2.7用户未评价咨询师72小时后自动3星评价

3.问答服务规则：
3.1咨询服务-问答通过抢单获取任务，获取任务后需1小时内回复问题，回复后的48小时内用户可提交追问，咨询师需在规定时间内（8:00-21:00需在3小时内，21:00-8:00需在次日11点前回复）回复任务中的追问。
3.2咨询服务-问答咨询师问题回复超时则自动取消任务，并做相应能力分扣除，30日内3次回复超时将冻结所有问答接单资格；如果问题的追问回复超时官方有权介入并取消任务，扣除本任务所有收益，30日内超3次追问回复超时，则冻结该问答接单资格。
3.3咨询服务-问答接单后5分钟内可选择弃答，48小时内超3次弃答，冻结所有问答接单资格3日，3日后自动取消。
3.4用户未评价咨询师72小时后自动3星评价。
3.5当用户对咨询师的回复提起申诉时，平台判定申诉成立后，则扣除咨询师本任务收益。
3.6平台不定时抽查咨询师回复质量，如发现咨询师回复涉嫌违规（违规范围：回答不专业、敷衍了事、答非所问、言语辱骂、索要联系方式、回复携带联系方式、回复携带广告等和问题无关信息。）的情况下，平台可扣除本任务收益。

4.咨询师等级及能力分：
4.1定制报告：
初始创建都为高级占星师（能力分100分），完成订单分成15%（税前）
能力分低于80分，账号相应接单资格冻结 能力分80-99分为专业占星师，完成订单分成10%（税前）
能力分达到100-499分则升级为高级占星师，完成订单分成15%（税前）
能力分达到500-1499分则升级为大师占星师，完成订单分成18%（税前）
能力分达到1500分升级为至臻占星师，完成订单分成20%（税前）

4.2问答-占星：
初始创建即为专业咨询师（能力分100），回答问题分成20%，回答追问分成50%
能力分低于80分，账号相应接单资格冻结
能力分到达301分升级为高级咨询师， 回答问题分成25%，回答追问分成50%
能力分到达801分升级为至臻咨询师，回答问题分成35%，回答追问分成50%

4.3问答-塔罗：
初始创建即为专业咨询师（能力分100），回答问题分成20%，回答追问分成50%
能力分低于80分，账号相应接单资格冻结
能力分到达301分升级为高级咨询师， 回答问题分成25%，回答追问分成50%
能力分到达801分升级为至臻咨询师，回答问题分成35%，回答追问分成50%

4.4问答-骰子：
回答问题分成固定为25%，回答追问分成50%，不涉及咨询师成长机制，也不会因为咨询师的成长等级而产生分成上面的变化。

4.5咨询连麦
咨询连麦初始分成为25%，例如连麦价格为10元/分钟，每分钟收益为2.5元
同一用户对同一个咨询师产生咨询订单时：
第1次为25%分成；
第2-5次为30%分成；
第6-10次为35%分成；
10次以上为40%分成；

5.其他：
因苹果应用商店的特殊性，苹果用户在问答支付时均以准币支付，咨询师回复完成后，我们会将准币以10准币一元钱的比例转化后，再按照咨询师的等级分成进行结算，例如用户支付1000准币，转化后为100元钱，咨询师如等级分成为20%，则税前分成为20元。',
            ],
        ];
        $data = [
            [
                'id' => 1,
                'title' => '准了咨询平台服务章程',
                'status' => 0,// 0=>未学习、1=>未通过、2=>已通过
                'content' => $wap,
            ],
        ];

        return show(200, '请求成功', $data);
    }

    /**
     * 获取平台培训考核题目
     */
    public function platformTest()
    {
        $data = [
            [
                'title' => '1111碰到有人在问题中填写手机号码时，应当',
                'image' => '',
                'type' => 1,// 单选
                'options' => [
                    [
                        'text' => '打电话，开始沟通',
                        'value' => 'A',
                    ],
                    [
                        'text' => '在报告内容中，把自己的电话号码也写上',
                        'value' => 'C',
                    ],
                    [
                        'text' => '直接联系客服进行处理',
                        'value' => 'B',
                    ],
                    [
                        'text' => '看看手机号能不能添加微信',
                        'value' => 'D',
                    ],
                ],
            ],
            [
                'title' => '2222碰到有人在问题填写手机号码时，应当',
                'image' => '',
                'type' => 2,// 多选
                'options' => [
                    [
                        'text' => '打电话，开始沟通22',
                        'value' => 'A',
                    ],
                    [
                        'text' => '在报告内容中，把自己的电话号码也写上22',
                        'value' => 'C',
                    ],
                    [
                        'text' => '直接联系客服进行处理',
                        'value' => 'B',
                    ],
                    [
                        'text' => '看看手机号能不能添加微信',
                        'value' => 'D',
                    ],
                ],
            ],
            [
                'title' => '3333碰到有人在问题填写手机号码时，应当',
                'image' => '',
                'type' => 1,// 单选
                'options' => [
                    [
                        'text' => '打电话，开始沟通',
                        'value' => 'A',
                    ],
                    [
                        'text' => '在报告内容中，把自己的电话号码也写上',
                        'value' => 'C',
                    ],
                    [
                        'text' => '直接联系客服进行处理',
                        'value' => 'B',
                    ],
                    [
                        'text' => '看看手机号能不能添加微信',
                        'value' => 'D',
                    ],
                ],
            ],
        ];

        return show(200, '请求成功', $data);
    }

    /**
     * 获取平台培训考核结果
     */
    public function platformResult()
    {
        $data = [
            'status' => (int)$this->astrInfo['check_status'] === 40 ? 2 : 1, // 1=>未通过、2=>已通过
        ];

        return show(200, '请求成功', $data);
    }

    public function accountInfo()
    {
//        $data = [
//            'telphone' => '185****6867',
//            'subscribe' => 0,
//            'passwordState' => 0,// 0=>安全性高的密码可以使帐号更安全。建议您定期更换密码，设置一个包含字母，符号或数字中至少两项且长度超过6位的密码。,1=>,2=>,3=>
//        ];

        $astrInfo = (new ZlcrAstrInfo())->getInfoById($this->astrInfo['id']);
        //银行卡信息
        $bank_info = [
            'bank_name' => $astrInfo['bank_name'], // 开户行
            'bank_branch_name' => $astrInfo['bank_branch_name'], // 支行
            'bank_card' => $astrInfo['bank_card'], // 银行卡号
            'bank_id_card_name' => $astrInfo['bank_id_card_name'], // 银行卡绑定的身份证名字
            'bank_id_card' => $astrInfo['bank_id_card'], // 银行卡绑定的身份证号
            'bank_branch_info' => $astrInfo['bank_branch_info'],//银行卡支行json数据
            'bank_branch_code' => '',//银行卡支行bankCode
        ];
        //身份证信息
        $id_card_info = [
            'name' => $astrInfo['name'],
            'id_card' => $astrInfo['id_card'],
            'left_pic' => $astrInfo['left_pic'],
            'right_pic' => $astrInfo['right_pic'],
            'hand_idcard_pic' => $astrInfo['hand_idcard_pic'],
        ];

        //解密敏感信息
        $bank_info = Util::astrologerSensitiveInfoDecodeOrEncode($bank_info);
        $id_card_info = Util::astrologerSensitiveInfoDecodeOrEncode($id_card_info);

        //返回用户的支行code
        if ($bank_info['bank_branch_info'])
        {
            $bank_branch_info = json_decode($bank_info['bank_branch_info'], true);
            if ($bank_branch_info && isset($bank_branch_info['bankCode']))
            {
                $bank_info['bank_branch_code'] = $bank_branch_info['bankCode'];
            }
            unset($bank_info['bank_branch_info']);//置空数据
        }

        //敏感信息进行隐藏
        $bank_info['bank_card'] = substr_replace($bank_info['bank_card'], '********', 4, 8);//银行卡号
        $bank_info['bank_id_card'] = substr_replace($bank_info['bank_id_card'], '**********', 4, 10);//银行卡绑定的身份证号
        $id_card_info['id_card'] = substr_replace($id_card_info['id_card'], '**********', 4, 10);//身份证号

        //获取私有图片地址
        $id_card_info['face_private_url'] = Upload::getOssPrivateUrl($id_card_info['left_pic']);
        $id_card_info['back_private_url'] = Upload::getOssPrivateUrl($id_card_info['right_pic']);
        $id_card_info['holding_private_url'] = Upload::getOssPrivateUrl($id_card_info['hand_idcard_pic']);
        if ($astrInfo['id_card'])
        {
            $id_card_info['id_card_verify_tips'] = '已认证';
        } else
        {
            $id_card_info['id_card_verify_tips'] = '未认证';
        }
        //准了号
//        $uen = '';
//        if ((int)$this->astrInfo['uid'] !== 0)
//        {//查询准了号
//            $user = (new \app\common\model\User())->getUserInfo(['id' => $this->astrInfo['uid']]);
//            if (isset($user['uen']))
//            {
//                $uen = $user['uen'];
//            }
//        }

        //查询是否是特邀用户
        $guestAstr = Db::table('zlcr_guest_user')->where('astr_id', $this->astrInfo['id'])->field('astr_id')->find();
        $hint_of_password = '';//密码提示信息
        if ($guestAstr && isset($guestAstr['astr_id']) && (int)$this->astrInfo['modify_password'] === 0)
        {//特邀用户没有修改初始密码
            $hint_of_password = '为了保证您的账号安全，请尽快修改初始密码';
        } else if (isset($this->astrInfo['create_time']) || isset($this->astrInfo['password_reset_at']))
        {//如果不为空，那么判断是否超过80天
            $password_reset_at = $this->astrInfo['password_reset_at'];
            if ((int)$password_reset_at === 0)
            {
                $password_reset_at = $this->astrInfo['create_time'];
            }

            $sep_seconds = time() - $password_reset_at;
            if ($sep_seconds > 60 * 60 * 24 * 80)
            {//超过80天未登录，提示用户
                $hint_of_password = '您已经超过80天，未修改密码，请尽快修改密码，超过90天会登录失败';
            }
        }

        //判断是否可以连麦
        $consultAstrInfo = $this->consultAccountInfo;
        $zyhsUid = $consultAstrInfo['consult_status'] === 1 && $consultAstrInfo['level_score'] > -10 ? 0 : -1;
        if ($zyhsUid === 0)
        {

            $userBindAstrInfo = (new ZyhsAstrBindUser())->getAstrBindUserData();
            if ($userBindAstrInfo)
            {
                $userBindAstrInfo = array_flip_key_value($userBindAstrInfo);
                $zyhsUid = $userBindAstrInfo[$this->astrInfo['id']] ?? 0;
            }
        }
        $data = [
            'password_tips' => $hint_of_password,// 修改密码标识 0=> 未修改过，1=>已修改
            'telphone' => substr_replace($this->astrInfo['tel'], '****', 3, 4),
            'tel' => $this->astrInfo['tel'],
            'id' => (int)$this->astrInfo['id'],
            'uid' => (int)$this->astrInfo['uid'],
            'zyhs_uid' => $zyhsUid,
            'subscribe' => isset($this->astrInfo['subscribe']) ? (int)$this->astrInfo['subscribe'] : 0,//todo 测试
            'bank_info' => $bank_info,
            'id_card_info' => $id_card_info,
//            'uen' => $uen
        ];

//        $this->subscribe();// 测试给用户发送微信通知

        return show(200, '请求成功', $data);
    }

    /**
     * 更新占星师信息
     */
    public function update()
    {

        $update_time = time();//更新时间

        //更新手机号
        $originMobile = input('originMobile/s', '');// 原手机号
        $newMoblie = input('newMoblie/s', '');// 更新的手机号
        $verifyCode = input('verifyCode/s', '');// 更新的手机号
        if ($originMobile !== '' && $newMoblie !== '' && $verifyCode !== '')
        {//todo 校验更新内容
            if (!preg_match("/^1[3456789]\d{9}$/", $originMobile))
            {
                return show(0, '原手机号格式错误，请检查！');
            } else if (!preg_match("/^1[3456789]\d{9}$/", $newMoblie))
            {
                return show(0, '新手机格式错误，请检查！');
            } else if ($this->astrInfo['tel'] !== $originMobile)
            {//检查用户请求的手机号是否正确
                return show(0, '原手机号输入错误，请检查！');
            } else
            {
                //检查验证码是否正确
                $mobileCode = Alidayu::getInstance()->checkSmsIdentify($newMoblie, 86);
                if ($verifyCode != $mobileCode)
                {
                    return show(config('code.error'), '短信验证码错误');
                }

                //检查新的手机号是否已经存在了
                $res = (new ZlcrAstr())->where('tel', $newMoblie)->field('id')->find();
                if ($res)
                {
                    return show(0, '更换手机号失败：您修改的手机号，已注册占星师平台！');
                }
            }

            //更新手机号
            try
            {
                //更新库
                Db::table('wechat_backup_07_18_14_43_00.zlcr_astr')->where('id', (int)$this->astrInfo['id'])->update([
                    'tel' => $newMoblie,
                    'update_time' => $update_time,
                ]);
                //删除缓存
                CacheManage::getInstance()
                    ->setCacheConfig('astr_admin.astr.details', $this->astrInfo['id'])
                    ->rmCache();
                return show(200, '更换成功', ['tel' => substr_replace($newMoblie, '****', 3, 4)]);
            }
            catch (Exception $e)
            {
                Log::write('占星师的手机号更换失败：' . $e->getMessage(), 'error', true);
                return show(0, '手机号更换失败');
            }
        }

        //修改密码
        $password = input('password/s', '');
        $repassword = input('repassword/s', '');
        if ($password !== '' && $repassword !== '')
        {//todo 校验更新内容
            if (strlen($password) < 8 || strlen($repassword) < 8)
            {
                return show(0, '密码不能少于8位');
            }
            if ($password !== $repassword)
            {
                return show(0, '两次输入的密码不一致');
            }
            if (!preg_match("/^(?![^a-zA-Z]+$)(?!\\\\D+$).{8,16}$/", $password))
            {
                return show(config('code.error'), '密码格式错误（8~16个字符，包含字母和数字）');
            }
            try
            {
                $passwordData = Login::passwordEncode($password);
                // 新密码入库
                Db::table('wechat_backup_07_18_14_43_00.zlcr_astr')->where('id', (int)$this->astrInfo['id'])->update([
                    'password' => $passwordData['password'],
                    'salt' => $passwordData['salt'],
                    'modify_password' => 1,
                    'update_time' => $update_time,
                    'password_reset_at' => $update_time,
                ]);
                //删除缓存
                CacheManage::getInstance()
                    ->setCacheConfig('astr_admin.astr.details', $this->astrInfo['id'])
                    ->rmCache();

                return show(200, '密码修改成功！');
            }
            catch (Exception $e)
            {
                Log::write('占星师的密码修改失败：' . $e->getMessage(), 'error', true);
                return show(0, '密码修改失败');
            }
        }

        //修改银行卡
        $bank_name = input('bank_name/s', '');
        $bank_branch_code = input('bank_branch_code/s', '');
        $bank_card = input('bank_card/s', '');
        $bank_id_card_name = input('bank_id_card_name/s', '');
        $bank_id_card = input('bank_id_card/s', '');
        if ($bank_name !== '' && $bank_branch_code !== '' && $bank_card !== '' && $bank_id_card !== '' && $bank_id_card_name !== '')
        {//todo 校验更新内容
            if (strlen($bank_id_card) != 18)
            {
                return show(0, '身份证号位数错误！');
            }
            //验证银行卡信息是否有改变，防止盗刷
            $astrInfo = (new ZlcrAstrInfo())->getInfoById($this->astrInfo['id']);
            if ($bank_card === $astrInfo['bank_card'])
            {
//                return show(0, '修改失败，您新修改的银行卡号和原来的一样！');
            }

            //判断银行卡号和身份证号，里面是否包含*
            if (strpos($bank_card, '*'))
            {
                return show(0, '银行卡号错误！');
            }

            //判断身份证号，里面是否包含*
            if (strpos($bank_id_card, '*'))
            {
                return show(0, '身份证号错误！');
            }

            //验证银行卡信息
            $bankCheckRes = Util::checkBankIdentityThreeElements($bank_card, $bank_id_card, $bank_id_card_name);
            if ($bankCheckRes['status'] === false)
            {
                $data['compeleteState'] = 3;
                $data['compeleteText'] = "<span class='tip'>{$bankCheckRes['msg']}</span>，请修改后重新提交审核。";
                return show(0, $bankCheckRes['msg'] . '，请修改后重新提交审核。');
            } else
            {
                //用户选择的银行=中国农业银行，查询云市场的支行名字为：农业银行
                //验证开户行是否正确
                if (strpos($bankCheckRes['data']['bankName'], $bank_name) === false && strpos($bank_name, $bankCheckRes['data']['bankName']) === false)
                {//不包含 解析出来有可能是 中国工商银行
                    Log::write('用户编辑银行卡资料，支持的银行卡错误（需要更新占星师前端的银行卡列表 或者 去掉银行名字的验证）：用户选择的银行=' . $bank_name . '，查询云市场的支行名字为：' . $bankCheckRes['data']['bankName'], 'error', true);
                    return show(0, $bankCheckRes['msg'] . '，开户行错误，请修改后重新提交审核。');
                }

                //根据联行号查询支行信息
                $bank_branch_info = Util::checkBankCode($bank_branch_code);
                if ($bank_branch_info['status'])
                {//成功，检查开户行是否一样
//                    if (strpos($bank_branch_info['data']['bank'], $bank_name) === false)
//                    {//不包含 解析出来有可能是 中国工商银行
//                        Log::write('用户编辑银行卡资料，支持的银行卡错误（需要更新占星师前端的银行卡列表 或者 去掉银行名字的验证）：用户选择的银行=' . $bank_name . '，查询云市场的支行名字为：' . $bank_branch_info['data']['bank'], 'error', true);
//                        return show(0, $bankCheckRes['msg'] . '，开户行错误，请修改后重新提交审核。');
//                    }
                } else
                {//失败
                    Log::write('支行信息查询失败，请修改后重新提交审核。', 'error', true);
                    return show(0, $bankCheckRes['msg'] . '支行信息查询失败，请修改后重新提交审核。');
                }
            }

            try
            {
                $updates = [
                    'bank_name' => $bank_branch_info['data']['bank'],
                    'bank_branch_name' => $bank_branch_info['data']['lName'],
                    'bank_card' => $bank_card,
                    'bank_id_card_name' => $bank_id_card_name,
                    'bank_id_card' => $bank_id_card,
                    'bank_info' => json_encode($bankCheckRes['data']),
                    'bank_branch_info' => json_encode($bank_branch_info['data']),
                    'update_time' => $update_time,
                ];
                $updates = Util::astrologerSensitiveInfoDecodeOrEncode($updates, false);
                // 更新数据库
                Db::table('wechat_backup_07_18_14_43_00.zlcr_astr_info')->where('astr_id', (int)$this->astrInfo['id'])->update($updates);
                //删除缓存
                CacheManage::getInstance()
                    ->setCacheConfig('astr_admin.astr_info.details', $this->astrInfo['id'])
                    ->rmCache();

                return show(200, '银行卡信息修改成功');
            }
            catch (Exception $e)
            {
                Log::write('占星师的银行卡修改失败：' . $e->getMessage(), 'error', true);
                return show(0, '银行卡修改失败');
            }
        }

        //修改身份证
        $name = input('name/s', '');
        $id_card = input('id_card/s', '');
        $left_pic = input('left_pic/s', '');
        $right_pic = input('right_pic/s', '');
        $hand_idcard_pic = input('hand_idcard_pic/s', '');
        if ($name !== '' && $id_card !== '' && $left_pic !== '' && $right_pic !== '' && $hand_idcard_pic !== '')
        {//todo 校验更新内容
            //判断身份证号，里面是否包含*
            if (strpos($bank_id_card, '*'))
            {
                return show(0, '身份证号错误！');
            }

            //检查身份证是否有变化，防止盗刷
            $astrInfo = (new ZlcrAstrInfo())->getInfoById($this->astrInfo['id']);
            if ($astrInfo['id_card'] === $id_card)
            {
//                return show(0, '修改失败，您新修改的身份证和原来的一样！');
            }

            //组装要更新的数据
            $update_info = [ // 有变更才更新
                // 'name' => $name,
                // 'id_card' => $id_card,
                // 'left_pic' => $left_pic,
                // 'right_pic' => $right_pic,
                // 'hand_idcard_pic' => $hand_idcard_pic,
                // 'left_pic_info' => '', // 图片识别信息
                // 'right_pic_info' => '',// 图片识别信息
                // 'hand_idcard_pic_info' => '',// 图片识别信息
                // 'update_time' => $update_time
            ];

            $astrData = [ // 有变更才更新 更新身份证正面照才更新
                // 'avatar' => '',
                // 'nickname' => ''
            ];

            if ($astrInfo['left_pic'] !== $left_pic)
            {
                //验证身份证正面照片
                $res = $this->checkPicOfIdCard($this->astrInfo['id'], 3, $left_pic);
                if ($res['status'] === true)
                {//验证成功，校验 用户输入的身份证是否一样
                    if ($res['data']['idcard'] !== $id_card)
                    {
                        return show(0, '修改失败，身份证号和图片不一致！');
                    } else if ($res['data']['name'] !== $name)
                    {
                        return show(0, '修改失败，身份证姓名和图片不一致！');
                    } else
                    {
                        $update_info['left_pic_info'] = json_encode($res['data']);
                        $update_info['id_card'] = $id_card;
                        $update_info['left_pic'] = $left_pic;

                        $month = date('m', $res['data']['birthday']);//19900906
                        $day = date('d', $res['data']['birthday']);//19900906
                        $sign_index = Util::getSignIndex($month, $day);
                        $avatar = '/zhunle_astrologer/avatar/' . $sign_index . '.png';
                        $astrData['avatar'] = $avatar;//头像
                        $astrData['nickname'] = mb_substr($res['data']['name'], 0, 1) . '老师';//昵称
                        $update_info['name'] = $res['data']['name'];//真实姓名
                    }
                } else
                {
                    return show(0, '修改失败，身份证正面照片验证失败！');
                }
            }

            if ($astrInfo['right_pic'] !== $right_pic)
            {
                //验证身份证反面照片
                $res = $this->checkPicOfIdCard($this->astrInfo['id'], 4, $right_pic);
                if (!$res['status'])
                {
                    return show(0, '修改失败，身份证反面照片验证失败！');
                } else
                {
                    $update_info['right_pic'] = $right_pic;
                    $update_info['right_pic_info'] = json_encode($res['data']);
                }
            }

            if ($astrInfo['hand_idcard_pic'] !== $hand_idcard_pic)
            {
                //验证手持身份证照片
                $res = $this->checkPicOfIdCard($this->astrInfo['id'], 5, $hand_idcard_pic);
                if (!$res['status'])
                {
                    return show(0, '修改失败，手持身份证照片验证失败！');
                } else
                {
                    if ($res['data']['score'] < 0.3)
                    {
                        Log::write('手持身份证照片认证结果，小于0.3（需要增加点）', 'error', true);
                        return show(0, '修改失败，手持身份证照片认证失败！');
                    }
                    $update_info['hand_idcard_pic'] = $hand_idcard_pic;
                    $update_info['hand_idcard_pic_info'] = json_encode($res['data']);
                }
            }

            try
            {
                if ($update_info)
                {
                    $update_info ['update_time'] = $update_time;
                    //加密数据
                    $update_info = Util::astrologerSensitiveInfoDecodeOrEncode($update_info, false);
                    // 更新数据库
                    Db::table('wechat_backup_07_18_14_43_00.zlcr_astr_info')->where('astr_id', (int)$this->astrInfo['id'])->update($update_info);
                    //删除缓存
                    CacheManage::getInstance()
                        ->setCacheConfig('astr_admin.astr_info.details', $this->astrInfo['id'])
                        ->rmCache();

                    if ($astrData)
                    {
                        // 更新占星师的昵称和头像
                        $res2 = (new ZlcrAstr())->UpdateData($this->astrInfo['id'], ['id' => $this->astrInfo['id']], [
                            'nickname' => $astrData['nickname'],
                            'avatar' => $astrData['avatar'],
                        ]);

                        if (!$res2)
                        {
                            return show(0, '更新占星师昵称和头像失败！');
                        }
                    }

                    return show(200, '身份证修改成功！');
                }

                return show(0, '身份信息无修改！');
            }
            catch (Exception $e)
            {
                Log::write('占星师的身份证修改失败：' . $e->getMessage(), 'error', true);
                return show(0, '身份证修改失败');
            }
        }

        //绑定准了号
        $uen = input('uen/s', '');
        if ($uen !== '')
        {//todo 校验更新内容
            //判断绑定的准了号，是否与该账户的手机号一样，如果不一样，那么提示
            $userApp = Db::table('app_user')->field('id,tel')->where('uen', $uen)->find();

            if (!$userApp)
            {
                return show(0, '绑定失败，该准了号不存在！');
            } else if ($this->astrInfo['tel'] !== $userApp['tel'])
            {
                return show(0, '绑定失败，该准了号绑定的手机号，与您当前的手机号不一致！');
            }
            try
            {
                Db::table('wechat_backup_07_18_14_43_00.zlcr_astr')->where('id', (int)$this->astrInfo['id'])->update(['uid' => $userApp['id']]);
                //删除缓存
                CacheManage::getInstance()
                    ->setCacheConfig('astr_admin.astr.details', $this->astrInfo['id'])
                    ->rmCache();
                return show(200, '准了号绑定成功！');
            }
            catch (Exception $e)
            {
                Log::write('占星师的准了号绑定失败：' . $e->getMessage(), 'error', true);
                return show(0, '准了号绑定失败');
            }
        }

        //绑定准有好事号
        $zyhsUen = input('zyhs_uen/s', '');
        if ($zyhsUen !== '')
        {
            //判断绑定的准了号，是否与该账户的手机号一样，如果不一样，那么提示
            $userApp = (new ZyhsUser())->field('id,tel')->where('uen', $zyhsUen)->find();
            if (!$userApp)
            {
                return show(0, '绑定失败，该准了号不存在！');
            } else if ($this->astrInfo['tel'] !== $userApp['tel'])
            {
                return show(0, '绑定失败，该准了号绑定的手机号，与您当前的手机号不一致！');
            }
            try
            {
                $userBindAstrInfo = (new ZyhsAstrBindUser())->getAstrBindUserData();
                if (isset($userBindAstrInfo[$userApp['id']]))
                {
                    (new ZyhsAstrBindUser())->updateData($userApp['id'], [
                        'status' => 2,
                        'unbind_time' => $this->request->time(),
                    ]);
                }
                (new ZyhsAstrBindUser())->saveData([
                    'uid' => $userApp['id'],
                    'astr_id' => $this->astrInfo['id'],
                    'status' => 1,
                    'create_time' => $this->request->time(),
                ]);
                return show(200, '准了号绑定成功！');
            }
            catch (Exception $e)
            {
                Log::write('占星师的准有好事号绑定失败：' . $e->getMessage(), 'error', true);
                return show(0, '准有好事号绑定失败');
            }
        }

        $data = [];

        return show(200, '请求成功', $data);
    }

    public function unBindZyhsUser()
    {
        $userBindAstrInfo = (new ZyhsAstrBindUser())->getAstrBindUserData();

        $uid = array_search($this->astrInfo['id'], $userBindAstrInfo);
        if ($uid)
        {
            (new ZyhsAstrBindUser())->updateData($uid, [
                'status' => 2,
                'unbind_time' => $this->request->time(),
            ]);
        }

        return show(config('code.success'), '解绑成功');
    }

    /**
     * 获取考试题目、当前进行到第几部、总共有多少题
     * @return Json
     */
    public function assessmentQuestion()
    {
        $index = input('index', 0);
        //选择题
        if ($index == 30)
        {
            $data = [
                "answer_right" => 28,//回答正确的数量
                "answer_wrong" => 1,//回答错误的数量
                "timeout_num" => 1,//超时的数量
                "step" => 10,//10：第一步；20：第二部；
                "index" => 30,//
                "max_question" => 30,//总共有多少题
                "isSuccessful" => true,
                "tips" => '恭喜您通过选择题考核，完成笔试考核即可入住平台',
            ];

            $data = [
                "answer_right" => 10,//回答正确的数量
                "answer_wrong" => 10,//回答错误的数量
                "timeout_num" => 10,//超时的数量
                "step" => 10,//10：第一步；20：第二部；
                "index" => 30,//
                "max_question" => 30,//总共有多少题
                "isSuccessful" => false,
                "tips" => '很遗憾您未能通过考核，请24小时后再次尝试',
            ];
        } else if ($index == 29)
        {
            $data = [
                "step" => 10,//10：第一步；20：第二部；
                "index" => 29,//
                "max_question" => 30,//总共有多少题
                "end_time" => 60,//结束时间s
                "title" => "1111111",//选择题标题
                "topic_option" => [
                    [
                        "text" => "土星",
                        "value" => "A",
                    ], [
                        "text" => "海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星王星",
                        "value" => "B",
                    ], [
                        "text" => "金星",
                        "value" => "C",
                    ], [
                        "text" => "冥王星",
                        "value" => "D",
                    ],
                ],
                "option_type" => 2,//1：单选；2：多选；3：简答题
                "title_img" => "",
                "tips" => "",

            ];
        } else
        {
            $data = [
                "step" => 10,//10：第一步；20：第二部；
                "index" => 28,//
                "max_question" => 30,//总共有多少题
                "end_time" => 60,//结束时间s
                "title" => "占卜与爱情相关的问题，投出哪个行星将比较有利？",//选择题标题
                "topic_option" => [
                    [
                        "text" => "土星",
                        "value" => "A",
                    ], [
                        "text" => "海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星王星",
                        "value" => "B",
                    ], [
                        "text" => "金星",
                        "value" => "C",
                    ], [
                        "text" => "冥王星",
                        "value" => "D",
                    ],
                ],
                "option_type" => 1,//1：单选；2：多选；3：简答题
                "title_img" => "",
                "tips" => "",

            ];
        }

        //简单题
        $content = input('content', 0);
        $id = input('id', 0);
        if ($id == 2 || $id == 225 || $id == 226)
        {
            if ($content)
            {
                //提交答案
                $data = [
                    "tips" => '恭喜您完成入驻考核，审核团队将在7个工作日内完成审核并发送结果至您的手机短信，请耐心等候',
                ];
            } else
            {
                $data = [
                    "step" => 20,//10：第一步；20：第二部；
                    "index" => 1,//当前为第几题
                    "max_question" => 1,//总共有多少题
                    "end_time" => 3600 * 4,//结束时间s
                    "title" => "海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海王星海王星海海王星海王星海王星海王星海",//简答题标题
                    "option_type" => 3,//1：单选；2：多选；3：简答题
                    //查看星盘
//                "astro" => [
//                    "is_merage" => false,//是否是合盘，true：是（server端在extend里保存两个档案）；false：否（server端在extend里保存一个档案）
//                    "id" => 225,//简答题（查看星盘）的id（用于获取星盘数据，获取档案信息）
//                ],
                    //查看合盘
                    "astro" => [
                        "is_merge" => true,//是否是合盘，true：是（server端在extend里保存两个档案）；false：否（server端在extend里保存一个档案）
                        "id" => 226,//简答题（查看合盘）的id（用于获取星盘数据，获取档案信息）
                    ],

                ];
            }
        }

        return show(200, '请求成功', $data);
    }

    public function subscribe()
    {
        $templateId = 'odu1luBA5JVUjR9xU6Uony7FQuNHy-pcJQ22Gu0AGoQ';// 公众平台测试号 消息模版ID

        $options = [
            'token' => ' novold', //填写你设定的key
            'encodingaeskey' => 'encodingaeskey', //填写加密用的EncodingAESKey
            'appid' => 'wx1deebe98ecba2533', //填写高级调用功能的app id, 请在微信开发模式后台查询
            'appsecret' => '86aede667ecfbcbfee231564f039dc7a', //填写高级调用功能的密钥
        ];
        $weObj = new Wechat($options); //创建实例对象
        //TODO：调用$weObj各实例方法
        $data = [
            'touser' => 'oWQUb5l0Wag8Sl5laK1YEL8KY9s8',// 需要发送的用户微信openid
            'template_id' => $templateId,
            'url' => 'http://192.168.0.183:9528/#/dashboard',// 点击详情时的跳转地址
            'topcolor' => '#FF0000',
            'data' => [
                //{{first.DATA}}
                //申请时间：{{keyword1.DATA}}
                //最新进度：{{keyword2.DATA}}
                //{{remark.DATA}}
            ],

//｛
//     "touser":"OPENID",
//     "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
//     "url":"http://weixin.qq.com/download",
//     "topcolor":"#FF0000",
//     "data":{
//         "参数名1": {
//             "value":"参数",
//             "color":"#173177"     //参数颜色
//         },
//         "Date":{
//             "value":"06月07日 19时24分",
//             "color":"#173177"
//         },
//         "CardNumber":{
//             "value":"0426",
//             "color":"#173177"
//         },
//         "Type":{
//             "value":"消费",
//             "color":"#173177"
//         }
//     }
//}
        ];
        $weObj->sendTemplateMessage($data);
//        $datas = $weObj->getServerIp();
//"223.166.222.100"
//"223.166.222.101"
//"223.166.222.102"
//"223.166.222.103"
//"223.166.222.104"
//"223.166.222.105"
//"223.166.222.106"
//"223.166.222.107"
//"223.166.222.111"
//"223.166.222.112"
//"223.166.222.117"
//"223.166.222.118"
//"223.166.222.120"
//"223.166.222.121"
//"223.166.222.122"
//"223.166.222.123"
//"101.91.60.80"
//"101.91.60.81"
//"121.51.66.16"
//"121.51.66.19"
//"121.51.66.26"
//"121.51.66.120"
//"157.255.192.54"
//"157.255.192.55"
//"58.60.9.75"
//"58.60.9.76"
//"58.60.9.77"
//"58.60.9.78"
//"59.36.121.222"
//"59.36.121.223"
//"121.51.162.73"
//"121.51.162.74"
//"121.51.162.55"
//"203.205.219.187"
//"203.205.219.188"
//"203.205.219.189"
//"203.205.219.190"
//"203.205.219.179"
//"203.205.219.180"
//"203.205.219.181"
//"203.205.219.182"
//"203.205.219.183"
//"203.205.219.184"
//"203.205.219.185"
//"203.205.219.186"
//"118.126.124.0/24"
//"119.29.180.0/24"
//"119.29.9.0/24"
//"162.62.80.0/24"
//"162.62.81.0/24"
//"42.192.0.0/24"
//"42.192.6.0/24"
//"42.192.7.0/24"
//"81.69.18.0/24"
//"81.69.19.0/24"
//"81.69.229.0/24"
//"81.71.140.0/24"
//"81.71.19.0/24"
    }

    /**
     * 获取临时微信关注二维码
     * @return Json
     */
    public function getSubscribeQrcode(): Json
    {
        $astrId = input('astr_id/d', 0);
        if (!$astrId)
        {
            return show(config('code.error'), '请求异常');
        }
        $options = [
            'token' => $this->token,
            'encodingaeskey' => $this->encodingaeskey,
            'appid' => $this->appID,
            'appsecret' => $this->appsecret,
        ];
        $wechatModel = new Wechat($options); //创建实例对象
        $ticket = $wechatModel->getQRCode($astrId, 0, 604800);
        $img_url = $wechatModel->getQRUrl($ticket['ticket']);
        return show(config('code.success'), '请求成功', ['img_url' => $img_url]);
    }

    /**
     * 检查图片是否解析完成
     * @param int $astrId
     * @param int $type 3：身份证正面；4：身份证反面；5：手持身份证；
     * @param string $img_url 图片的oss地址
     * @return array|false[]
     */
    private function checkPicOfIdCard(int $astrId, int $type = 3, string $img_url = '')
    {
        $data = [
            'status' => false,
            'data' => '',
        ];

        $key = [
            3 => 'left_pic',
            4 => 'right_pic',
            5 => 'hand_idcard_pic',
        ];

        $uploadPath = Cache::get('astr_admin:upload_path:' . $astrId, []);

        if (isset($uploadPath[$key[$type]]['path'], $uploadPath[$key[$type]]['data']) && $img_url === $uploadPath[$key[$type]]['path'])
        {
            return [
                'status' => true,
                'data' => $uploadPath[$key[$type]]['data'],
            ];
        } else
        {
            return $data;
        }
    }

    public function gradeChangeRecode()
    {
        $data = Db::table('wechat_backup_07_18_14_43_00.zlcr_astr_grade_change_recode')
            ->alias('r')->join('wechat_backup_07_18_14_43_00.zlcr_custom_report_question_comment c', 'r.qid=c.qid', 'left')
            ->where('r.astr_id', $this->astrInfo['id'])->order('id desc')
            ->field('r.qid,r.change,r.astro_grade,r.type,r.create_time,c.level')
            ->paginate()->toArray();

        $recodeData = [];
        foreach ($data['data'] as $recodeItem)
        {
            $cause = '';
            switch ($recodeItem['type'])
            {
                case 1:
                case 2:
                    $arr_n = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"];
                    $cause = $arr_n[$recodeItem['level']] . '星评价';
                    break;
                case 3:
                    $cause = '提交超时';
                    break;
                case 4:
                    $cause = '订单超时';
                    break;
                case 5:
                    $cause = '完成订单';
                    break;
                case 6:
                    $cause = '审核超限';
                    break;
            }

            $recodeData[] = [
                'type' => in_array($recodeItem['type'], [1, 2], false) ? "用户评价" : "占星师行为",
                'qid' => $recodeItem['qid'],
                'change' => $recodeItem['change'],
                'astro_grade' => $recodeItem['astro_grade'], // 变动后星力值
                'cause' => $cause, // 原因
                'time' => date('Y-m-d H:i', $recodeItem['create_time']),
            ];
        }

        $data['data'] = $recodeData;
        return show(config('code.success'), '请求成功', $data);
    }
}
